xend: Support "bootloader" mode for "drbd:" devices
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 4 Sep 2009 07:42:10 +0000 (08:42 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 4 Sep 2009 07:42:10 +0000 (08:42 +0100)
To be able to use "bootloader" on drbd devices the following changes
need to be made:

*) Translation of devicename

_parse_uname which is used by blkdev_uname_to_file which is again used
by _configureBootloader in XendDomainInfo needs to be able to resolve
drbd resources to the corresponding blockdevice to feed to the
configured bootloader.

*) Activation of drbd device

If the drbd device isn't in Primary mode when the bootloader tries to
fetch the kernel and initrd, the start of the DomU will fail. To
prevent this the given drbd device will be made Primary before the
bootloader gets executed.

A note on the naming of drbd resouces: drbd uses mostly resource names
in it's userland tools. Because of that drbd VBDs, if configured with
the "drbd:" type, should always use the drbd resource name as
suggested by the drbd documentation at
http://www.drbd.org/users-guide-emb/s-xen-configure-domu.html. My
patches assume that the VBDs are named accordingly.

Signed-off-by: Michael Renner <michael.renner@geizhals.at>
tools/python/xen/util/blkif.py
tools/python/xen/xend/XendDomainInfo.py

index 6091afe5acbc50ae048ea634774b464f1fe1a44b..c73a946a256b9570c52b8206fd1cba778c28d37f 100644 (file)
@@ -75,8 +75,17 @@ def _parse_uname(uname):
     fn = taptype = None
     if uname.find(":") != -1:
         (typ, fn) = uname.split(":", 1)
-        if typ in ("phy", "drbd") and not fn.startswith("/"):
+
+        if typ == "phy" and not fn.startswith("/"):
             fn = "/dev/%s" %(fn,)
+
+        if typ == "drbd":
+            if not fn.startswith("drbd"):
+                (drbdadmstdin, drbdadmstdout) = os.popen2(["/sbin/drbdadm", "sh-dev", fn])
+                fn = drbdadmstdout.readline().strip()
+            else:
+                fn = "/dev/%s" %(fn,)
+               
         if typ == "tap":
             (taptype, fn) = fn.split(":", 1)
     return (fn, taptype)
index 32496041d165803b7159737807bfd16c55782d6a..53bdf4eaa65abf76a7794e051f7e3bbe8330a077 100644 (file)
@@ -2994,6 +2994,16 @@ class XendDomainInfo:
             disk = devinfo[1]['uname']
 
             fn = blkdev_uname_to_file(disk)
+
+            # If this is a drbd volume, check if we need to activate it
+            if disktype.find(":") != -1:
+                (disktype, diskname) = disk.split(':', 1)
+                if disktype == 'drbd':
+                    (drbdadmstdin, drbdadmstdout) = os.popen2(["/sbin/drbdadm", "state", diskname])
+                    (state, junk) = drbdadmstdout.readline().split('/', 1)
+                    if state == 'Secondary':
+                        os.system('/sbin/drbdadm primary ' + diskname)
+
             taptype = blkdev_uname_to_taptype(disk)
             mounted = devtype in ['tap', 'tap2'] and taptype != 'aio' and taptype != 'sync' and not os.stat(fn).st_rdev
             if mounted: